Make grant table map/unmap argument, host_addr, feature-specific.
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Thu, 13 Apr 2006 09:29:27 +0000 (10:29 +0100)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Thu, 13 Apr 2006 09:29:27 +0000 (10:29 +0100)
Introduce gnttab_set_map_op() and gnttab_set_unmap_op() to initialize.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
linux-2.6-xen-sparse/drivers/xen/blkback/blkback.c
linux-2.6-xen-sparse/drivers/xen/blkback/interface.c
linux-2.6-xen-sparse/drivers/xen/blktap/blktap.c
linux-2.6-xen-sparse/drivers/xen/blktap/interface.c
linux-2.6-xen-sparse/drivers/xen/netback/interface.c
linux-2.6-xen-sparse/drivers/xen/netback/netback.c
linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c
linux-2.6-xen-sparse/drivers/xen/tpmback/tpmback.c
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_backend_client.c
linux-2.6-xen-sparse/include/xen/gnttab.h

index fe2367a8fc94eeddf70f29d2455565d864c3b21c..3bae1313ed141a91c781fad4a342e5bffafc63ae 100644 (file)
@@ -186,9 +186,8 @@ static void fast_flush_area(pending_req_t *req)
                handle = pending_handle(req, i);
                if (handle == BLKBACK_INVALID_HANDLE)
                        continue;
-               unmap[invcount].host_addr    = vaddr(req, i);
-               unmap[invcount].dev_bus_addr = 0;
-               unmap[invcount].handle       = handle;
+               gnttab_set_unmap_op(&unmap[i], vaddr(req, i), GNTMAP_host_map,
+                                   handle);
                pending_handle(req, i) = BLKBACK_INVALID_HANDLE;
                invcount++;
        }
@@ -384,6 +383,8 @@ static void dispatch_rw_block_io(blkif_t *blkif,
        pending_req->nr_pages  = nseg;
 
        for (i = 0; i < nseg; i++) {
+               uint32_t flags;
+
                seg[i].nsec = req->seg[i].last_sect -
                        req->seg[i].first_sect + 1;
 
@@ -392,12 +393,11 @@ static void dispatch_rw_block_io(blkif_t *blkif,
                        goto fail_response;
                preq.nr_sects += seg[i].nsec;
 
-               map[i].host_addr = vaddr(pending_req, i);
-               map[i].dom = blkif->domid;
-               map[i].ref = req->seg[i].gref;
-               map[i].flags = GNTMAP_host_map;
+               flags = GNTMAP_host_map;
                if ( operation == WRITE )
-                       map[i].flags |= GNTMAP_readonly;
+                       flags |= GNTMAP_readonly;
+               gnttab_set_map_op(&map[i], vaddr(pending_req, i), flags,
+                                 req->seg[i].gref, blkif->domid);
        }
 
        ret = HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, map, nseg);
index c220efcf4bab04d0234410b6446b9cf44c1ee481..d82b9ebc3a411345ac79c19af018c038ccaf90b7 100644 (file)
@@ -58,10 +58,8 @@ static int map_frontend_page(blkif_t *blkif, unsigned long shared_page)
        struct gnttab_map_grant_ref op;
        int ret;
 
-       op.host_addr = (unsigned long)blkif->blk_ring_area->addr;
-       op.flags     = GNTMAP_host_map;
-       op.ref       = shared_page;
-       op.dom       = blkif->domid;
+       gnttab_set_map_op(&op, (unsigned long)blkif->blk_ring_area->addr,
+                         GNTMAP_host_map, shared_page, blkif->domid);
 
        lock_vm_area(blkif->blk_ring_area);
        ret = HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1);
@@ -90,9 +88,8 @@ static void unmap_frontend_page(blkif_t *blkif)
        struct gnttab_unmap_grant_ref op;
        int ret;
 
-       op.host_addr    = (unsigned long)blkif->blk_ring_area->addr;
-       op.handle       = blkif->shmem_handle;
-       op.dev_bus_addr = 0;
+       gnttab_set_unmap_op(&op, (unsigned long)blkif->blk_ring_area->addr,
+                           GNTMAP_host_map, blkif->shmem_handle);
 
        lock_vm_area(blkif->blk_ring_area);
        ret = HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1);
index 2442cea6331b50cd8b6d29ea1819ce99f1510000..ecf303fbc31e1f75d87a6ca0b9ce61c7965d5ced 100644 (file)
@@ -418,9 +418,9 @@ static void fast_flush_area(int idx, int nr_pages)
                if (BLKTAP_INVALID_HANDLE(handle))
                        continue;
 
-               unmap[op].host_addr = MMAP_VADDR(mmap_vstart, idx, i);
-               unmap[op].dev_bus_addr = 0;
-               unmap[op].handle = handle->kernel;
+               gnttab_set_unmap_op(&unmap[op],
+                                   MMAP_VADDR(mmap_vstart, idx, i),
+                                   GNTMAP_host_map, handle->kernel);
                op++;
 
                if (create_lookup_pte_addr(
@@ -430,9 +430,10 @@ static void fast_flush_area(int idx, int nr_pages)
                        DPRINTK("Couldn't get a pte addr!\n");
                        return;
                }
-               unmap[op].host_addr    = ptep;
-               unmap[op].dev_bus_addr = 0;
-               unmap[op].handle       = handle->user;
+               gnttab_set_unmap_grnat_ref(&unmap[op], ptep,
+                                          GNTMAP_host_map |
+                                          GNTMAP_application_map |
+                                          GNTMAP_contains_pte, handle->user);
                op++;
             
                BLKTAP_INVALIDATE_HANDLE(handle);
@@ -703,21 +704,21 @@ static void dispatch_rw_block_io(blkif_t *blkif, blkif_request_t *req)
                unsigned long uvaddr;
                unsigned long kvaddr;
                uint64_t ptep;
+               uint32_t flags;
 
                uvaddr = MMAP_VADDR(user_vstart, pending_idx, i);
                kvaddr = MMAP_VADDR(mmap_vstart, pending_idx, i);
 
-               /* Map the remote page to kernel. */
-               map[op].host_addr = kvaddr;
-               map[op].dom   = blkif->domid;
-               map[op].ref   = req->seg[i].gref;
-               map[op].flags = GNTMAP_host_map;
+               flags = GNTMAP_host_map;
                /* This needs a bit more thought in terms of interposition: 
                 * If we want to be able to modify pages during write using 
                 * grant table mappings, the guest will either need to allow 
                 * it, or we'll need to incur a copy. Bit of an fbufs moment. ;) */
                if (req->operation == BLKIF_OP_WRITE)
-                       map[op].flags |= GNTMAP_readonly;
+                       flags |= GNTMAP_readonly;
+               /* Map the remote page to kernel. */
+               gnttab_set_map_op(&map[op], kvaddr, flags, req->seg[i].gref,
+                                 blkif->domid);
                op++;
 
                /* Now map it to user. */
@@ -728,14 +729,13 @@ static void dispatch_rw_block_io(blkif_t *blkif, blkif_request_t *req)
                        goto bad_descriptor;
                }
 
-               map[op].host_addr = ptep;
-               map[op].dom       = blkif->domid;
-               map[op].ref       = req->seg[i].gref;
-               map[op].flags     = GNTMAP_host_map | GNTMAP_application_map
+               flags = GNTMAP_host_map | GNTMAP_application_map
                        | GNTMAP_contains_pte;
                /* Above interposition comment applies here as well. */
                if (req->operation == BLKIF_OP_WRITE)
-                       map[op].flags |= GNTMAP_readonly;
+                       flags |= GNTMAP_readonly;
+               gnttab_set_map_op(&map[op], ptep, flags, req->seg[i].gref,
+                                 blkif->domid);
                op++;
        }
 
index 99cb7bfdb202c4f32cdd3a4b697fb257f1d13956..f341f9ac33c597ff4ea13cb201401fcee923f2bc 100644 (file)
@@ -33,10 +33,8 @@ static int map_frontend_page(blkif_t *blkif, unsigned long shared_page)
        struct gnttab_map_grant_ref op;
        int ret;
 
-       op.host_addr = (unsigned long)blkif->blk_ring_area->addr;
-       op.flags     = GNTMAP_host_map;
-       op.ref       = shared_page;
-       op.dom       = blkif->domid;
+       gnttab_set_map_op(&op, (unsigned long)blkif->blk_ring_area->addr,
+                         GNTMAP_host_map, shared_page, blkif->domid);
 
        lock_vm_area(blkif->blk_ring_area);
        ret = HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1);
@@ -59,9 +57,8 @@ static void unmap_frontend_page(blkif_t *blkif)
        struct gnttab_unmap_grant_ref op;
        int ret;
 
-       op.host_addr    = (unsigned long)blkif->blk_ring_area->addr;
-       op.handle       = blkif->shmem_handle;
-       op.dev_bus_addr = 0;
+       gnttab_set_unmap_op(&op, (unsigned long)blkif->blk_ring_area->addr,
+                           GNTMAP_host_map, blkif->shmem_handle);
 
        lock_vm_area(blkif->blk_ring_area);
        ret = HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1);
index 5c3cbc75d971f7673373c86a1b566853aaa5c730..f4407bccdcbcf3439634862ebc129dcbc5dffe87 100644 (file)
@@ -150,10 +150,8 @@ static int map_frontend_pages(
        struct gnttab_map_grant_ref op;
        int ret;
 
-       op.host_addr = (unsigned long)netif->tx_comms_area->addr;
-       op.flags     = GNTMAP_host_map;
-       op.ref       = tx_ring_ref;
-       op.dom       = netif->domid;
+       gnttab_set_map_op(&op, (unsigned long)netif->tx_comms_area->addr,
+                         GNTMAP_host_map, tx_ring_ref, netif->domid);
     
        lock_vm_area(netif->tx_comms_area);
        ret = HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1);
@@ -168,10 +166,8 @@ static int map_frontend_pages(
        netif->tx_shmem_ref    = tx_ring_ref;
        netif->tx_shmem_handle = op.handle;
 
-       op.host_addr = (unsigned long)netif->rx_comms_area->addr;
-       op.flags     = GNTMAP_host_map;
-       op.ref       = rx_ring_ref;
-       op.dom       = netif->domid;
+       gnttab_set_map_op(&op, (unsigned long)netif->rx_comms_area->addr,
+                         GNTMAP_host_map, rx_ring_ref, netif->domid);
 
        lock_vm_area(netif->rx_comms_area);
        ret = HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1);
@@ -194,18 +190,16 @@ static void unmap_frontend_pages(netif_t *netif)
        struct gnttab_unmap_grant_ref op;
        int ret;
 
-       op.host_addr    = (unsigned long)netif->tx_comms_area->addr;
-       op.handle       = netif->tx_shmem_handle;
-       op.dev_bus_addr = 0;
+       gnttab_set_unmap_op(&op, (unsigned long)netif->tx_comms_area->addr,
+                           GNTMAP_host_map, netif->tx_shmem_handle);
 
        lock_vm_area(netif->tx_comms_area);
        ret = HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1);
        unlock_vm_area(netif->tx_comms_area);
        BUG_ON(ret);
 
-       op.host_addr    = (unsigned long)netif->rx_comms_area->addr;
-       op.handle       = netif->rx_shmem_handle;
-       op.dev_bus_addr = 0;
+       gnttab_set_unmap_op(&op, (unsigned long)netif->rx_comms_area->addr,
+                           GNTMAP_host_map, netif->rx_shmem_handle);
 
        lock_vm_area(netif->rx_comms_area);
        ret = HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1);
index 8b2b66b1399b6c1f7f747e95f472d9e5373e38cc..f6e161676bc559edce4352973bab76c6d572941e 100644 (file)
@@ -453,9 +453,9 @@ inline static void net_tx_action_dealloc(void)
        gop = tx_unmap_ops;
        while (dc != dp) {
                pending_idx = dealloc_ring[MASK_PEND_IDX(dc++)];
-               gop->host_addr    = MMAP_VADDR(pending_idx);
-               gop->dev_bus_addr = 0;
-               gop->handle       = grant_tx_handle[pending_idx];
+               gnttab_set_unmap_op(gop, MMAP_VADDR(pending_idx),
+                                   GNTMAP_host_map,
+                                   grant_tx_handle[pending_idx]);
                gop++;
        }
        ret = HYPERVISOR_grant_table_op(
@@ -579,10 +579,9 @@ static void net_tx_action(unsigned long unused)
                /* Packets passed to netif_rx() must have some headroom. */
                skb_reserve(skb, 16);
 
-               mop->host_addr = MMAP_VADDR(pending_idx);
-               mop->dom       = netif->domid;
-               mop->ref       = txreq.gref;
-               mop->flags     = GNTMAP_host_map | GNTMAP_readonly;
+               gnttab_set_map_op(mop, MMAP_VADDR(pending_idx),
+                                 GNTMAP_host_map | GNTMAP_readonly,
+                                 txreq.gref, netif->domid);
                mop++;
 
                memcpy(&pending_tx_info[pending_idx].req,
index 93ab2b70a824e67fa6959c3be13a8a75a09ba0ee..c31c3fdf6e6f992f1a5bab33c22753f698eda682 100644 (file)
@@ -13,6 +13,7 @@
 
 #include "common.h"
 #include <xen/balloon.h>
+#include <xen/gnttab.h>
 
 static kmem_cache_t *tpmif_cachep;
 int num_frontends = 0;
@@ -72,12 +73,10 @@ tpmif_t *tpmif_find(domid_t domid, long int instance)
 static int map_frontend_page(tpmif_t *tpmif, unsigned long shared_page)
 {
        int ret;
-       struct gnttab_map_grant_ref op = {
-               .host_addr = (unsigned long)tpmif->tx_area->addr,
-               .flags = GNTMAP_host_map,
-               .ref = shared_page,
-               .dom = tpmif->domid,
-       };
+       struct gnttab_map_grant_ref op;
+
+       gnttab_set_map_op(&op, (unsigned long)tpmif->tx_area->addr,
+                         GNTMAP_host_map, shared_page, tpmif->domid);
 
        lock_vm_area(tpmif->tx_area);
        ret = HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1);
@@ -100,9 +99,8 @@ static void unmap_frontend_page(tpmif_t *tpmif)
        struct gnttab_unmap_grant_ref op;
        int ret;
 
-       op.host_addr    = (unsigned long)tpmif->tx_area->addr;
-       op.handle       = tpmif->shmem_handle;
-       op.dev_bus_addr = 0;
+       gnttab_set_unmap_op(&op, (unsigned long)tpmif->tx_area->addr,
+                           GNTMAP_host_map, tpmif->shmem_handle);
 
        lock_vm_area(tpmif->tx_area);
        ret = HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1);
index 1fda74eb43570de4438e63c170c8befdc1b59282..cb7cc74e218198d230ae2b26419c5f46afce960e 100644 (file)
@@ -21,6 +21,7 @@
 #include <asm/uaccess.h>
 #include <xen/xenbus.h>
 #include <xen/interface/grant_table.h>
+#include <xen/gnttab.h>
 
 /* local data structures */
 struct data_exchange {
@@ -278,10 +279,8 @@ int _packet_write(struct packet *pak,
                        return 0;
                }
 
-               map_op.host_addr = MMAP_VADDR(tpmif, i);
-               map_op.flags = GNTMAP_host_map;
-               map_op.ref = tx->ref;
-               map_op.dom = tpmif->domid;
+               gnttab_set_map_op(&map_op, MMAP_VADDR(tpmif, i),
+                                 GNTMAP_host_map, tx->ref, tpmif->domid);
 
                if (unlikely(HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref,
                                                       &map_op, 1))) {
@@ -308,9 +307,8 @@ int _packet_write(struct packet *pak,
                }
                tx->size = tocopy;
 
-               unmap_op.host_addr = MMAP_VADDR(tpmif, i);
-               unmap_op.handle = handle;
-               unmap_op.dev_bus_addr = 0;
+               gnttab_set_unmap_op(&unmap_op, MMAP_VADDR(tpmif, i),
+                                   GNTMAP_host_map, handle);
 
                if (unlikely
                    (HYPERVISOR_grant_table_op
@@ -422,10 +420,8 @@ static int packet_read_shmem(struct packet *pak,
 
                tx = &tpmif->tx->ring[i].req;
 
-               map_op.host_addr = MMAP_VADDR(tpmif, i);
-               map_op.flags = GNTMAP_host_map;
-               map_op.ref = tx->ref;
-               map_op.dom = tpmif->domid;
+               gnttab_set_map_op(&map_op, MMAP_VADDR(tpmif, i),
+                                 GNTMAP_host_map, tx->ref, tpmif->domid);
 
                if (unlikely(HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref,
                                                       &map_op, 1))) {
@@ -461,9 +457,8 @@ static int packet_read_shmem(struct packet *pak,
                        tpmif->domid, buffer[offset], buffer[offset + 1],
                        buffer[offset + 2], buffer[offset + 3]);
 
-               unmap_op.host_addr = MMAP_VADDR(tpmif, i);
-               unmap_op.handle = handle;
-               unmap_op.dev_bus_addr = 0;
+               gnttab_set_unmap_op(&unmap_op, MMAP_VADDR(tpmif, i),
+                                   GNTMAP_host_map, handle);
 
                if (unlikely
                    (HYPERVISOR_grant_table_op
index 72327ec692019cbb43142059c5e59972e91cc40b..398541a1f363999a66707c50b6b565c44fca0340 100644 (file)
 /* Based on Rusty Russell's skeleton driver's map_page */
 int xenbus_map_ring_valloc(struct xenbus_device *dev, int gnt_ref, void **vaddr)
 {
-       struct gnttab_map_grant_ref op = {
-               .flags = GNTMAP_host_map,
-               .ref   = gnt_ref,
-               .dom   = dev->otherend_id,
-       };
+       struct gnttab_map_grant_ref op;
        struct vm_struct *area;
 
        *vaddr = NULL;
@@ -50,8 +46,9 @@ int xenbus_map_ring_valloc(struct xenbus_device *dev, int gnt_ref, void **vaddr)
        if (!area)
                return -ENOMEM;
 
-       op.host_addr = (unsigned long)area->addr;
-
+       gnttab_set_map_op(&op, (unsigned long)area->addr, GNTMAP_host_map,
+                         gnt_ref, dev->otherend_id);
+       
        lock_vm_area(area);
        BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1));
        unlock_vm_area(area);
@@ -76,13 +73,10 @@ EXPORT_SYMBOL_GPL(xenbus_map_ring_valloc);
 int xenbus_map_ring(struct xenbus_device *dev, int gnt_ref,
                   grant_handle_t *handle, void *vaddr)
 {
-       struct gnttab_map_grant_ref op = {
-               .host_addr = (unsigned long)vaddr,
-               .flags     = GNTMAP_host_map,
-               .ref       = gnt_ref,
-               .dom       = dev->otherend_id,
-       };
-
+       struct gnttab_map_grant_ref op;
+       
+       gnttab_set_map_op(&op, (unsigned long)vaddr, GNTMAP_host_map,
+                         gnt_ref, dev->otherend_id);
        BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1));
 
        if (op.status != GNTST_okay) {
@@ -101,9 +95,7 @@ EXPORT_SYMBOL_GPL(xenbus_map_ring);
 int xenbus_unmap_ring_vfree(struct xenbus_device *dev, void *vaddr)
 {
        struct vm_struct *area;
-       struct gnttab_unmap_grant_ref op = {
-               .host_addr = (unsigned long)vaddr,
-       };
+       struct gnttab_unmap_grant_ref op;
 
        /* It'd be nice if linux/vmalloc.h provided a find_vm_area(void *addr)
         * method so that we don't have to muck with vmalloc internals here.
@@ -124,7 +116,8 @@ int xenbus_unmap_ring_vfree(struct xenbus_device *dev, void *vaddr)
                return GNTST_bad_virt_addr;
        }
 
-       op.handle = (grant_handle_t)area->phys_addr;
+       gnttab_set_unmap_op(&op, (unsigned long)vaddr, GNTMAP_host_map,
+                           (grant_handle_t)area->phys_addr);
 
        lock_vm_area(area);
        BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1));
@@ -145,11 +138,10 @@ EXPORT_SYMBOL_GPL(xenbus_unmap_ring_vfree);
 int xenbus_unmap_ring(struct xenbus_device *dev,
                     grant_handle_t handle, void *vaddr)
 {
-       struct gnttab_unmap_grant_ref op = {
-               .host_addr = (unsigned long)vaddr,
-               .handle    = handle,
-       };
+       struct gnttab_unmap_grant_ref op;
 
+       gnttab_set_unmap_op(&op, (unsigned long)vaddr, GNTMAP_host_map,
+                           handle);
        BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1));
 
        if (op.status != GNTST_okay)
index e9fd1b63ae81b96c5a17964c6322ff5f0392ffd5..4b759485deb1073b15624a81166fccb9ea7f084a 100644 (file)
@@ -40,6 +40,7 @@
 #include <linux/config.h>
 #include <asm/hypervisor.h>
 #include <xen/interface/grant_table.h>
+#include <xen/features.h>
 
 /* NR_GRANT_FRAMES must be less than or equal to that configured in Xen */
 #ifdef __ia64__
@@ -113,6 +114,37 @@ void gnttab_grant_foreign_transfer_ref(grant_ref_t, domid_t domid,
 int gnttab_suspend(void);
 int gnttab_resume(void);
 
+static inline void
+gnttab_set_map_op(struct gnttab_map_grant_ref *map, unsigned long addr,
+                 uint32_t flags, grant_ref_t ref, domid_t domid)
+{
+       if (flags & GNTMAP_contains_pte)
+               map->host_addr = addr;
+       else if (xen_feature(XENFEAT_auto_translated_physmap))
+               map->host_addr = __pa(addr);
+       else
+               map->host_addr = addr;
+
+       map->flags = flags;
+       map->ref = ref;
+       map->dom = domid;
+}
+
+static inline void
+gnttab_set_unmap_op(struct gnttab_unmap_grant_ref *unmap, unsigned long addr,
+                   uint32_t flags, grant_handle_t handle)
+{
+       if (flags & GNTMAP_contains_pte)
+               unmap->host_addr = addr;
+       else if (xen_feature(XENFEAT_auto_translated_physmap))
+               unmap->host_addr = __pa(addr);
+       else
+               unmap->host_addr = addr;
+
+       unmap->handle = handle;
+       unmap->dev_bus_addr = 0;
+}
+
 #endif /* __ASM_GNTTAB_H__ */
 
 /*